package com.zjl.Zookeeper.第06章_源码分析;

/**
 * Zookeeper是如何保证数据一致性的?
 * 这也是困扰分布式系统框架的一个难题。
 *
 * Paxos算法 ：
 *  一种基于消息传递且具有高度容错特性的一致性算法。
 * Paxos算法解决的问题:
 *      就是如何快速正确的在一个分布式系统中对某个数据值达成一致，
 *      并且保证不论发生任何异常，都不会破坏整个系统的一致性。
 *
 * 在一个Paxos系统中，首先将所有节点划分为 (注意: 每个节点都可以身兼数职)。
 *      Proposer (提议者)，
 *      Acceptor (接受者)
 *      Learner (学习者)  无视，只会被动接受
 *
 *  没啥看的，就是提议者发出全局唯一且递增id的提议，如果超过半数同意次提议，就会同意并接受修改
 *  但是可能有多个提议者，会冲突
 *  -----------------------------------------------------------------
 *  (1) Prepare: Proposer生成全局唯一且递增的 Proposal ID,
 *      向所有 Acceptor 发送 Propose 请求，这里无需携带提案内容，只携带 Proposal ID 即可。
 *  (2) Promise: Acceptor 收到 Propose 请求后，做出“两个承诺，一个应答”。
 *      ➢不再接受Proposal ID小于等于(注意:这里是<=)当前请求的Propose请求。
 *      ➢不再接受Proposal ID小于(注意:这里是<)当前请求的Accept请求。
 *      ➢不违背以前做出的承诺下，回复已经Accept过的提案中Proposal ID最大的那个提案的Value和Proposal ID，
 *          没有则返回空值。
 *  (3) Propose: Proposer收到多数Acceptor的Promise应答后，从应答中选择Proposal ID最大的提案的Value，
 *      作为本次要发起的提案。如果所有应答的提案Value均为空值，则可以自己随意决定提案Value。
 *      然后携带当前ProposalID，向所有Acceptor发送 Propose请求。
 *  (4) Accept: Acceptor收到Propose请求后，在不违背自己之前做出的承诺下，接受并持久化当前Proposal ID和提案Value。
 *  (5) Learn: Proposer收到多数 Cceptor 的 Acep后，决议形成，将形成的决议发送给所有Leaner
 *
 *
 */
public class A1_Paxos算法 {
}
